package com.example.service.user;

import com.example.exception.InvalidTokenException;
import com.example.pojo.User;

/**
 * 用户授权服务, 包括用户权限的赋予, 刷新, 撤销
 * 鉴于单一权责原则, 此接口将验证 token 的方法已移除 如需使用, 请参见 {@link UserAuthenticationService#login(String)}
 * @author LeXin Huang
 * @date 2021年03月22日 17:26
 */
public interface UserAuthorizationService {
    /**
     * 通过用户名移除用户令牌 (如果存在)
     * @param username 用户名
     */
    void removeUserTokenByUsername(String username);

    /**
     * 登出操作, 会移除对应的 token
     * @param token 用户令牌
     * @throws InvalidTokenException 当 token 无效时
     */
    void logout(String token) throws InvalidTokenException;

    /**
     * 刷新用户的 token 和用户信息的缓存, 同时改变内容以及持续时间
     * @param token 用户令牌
     * @param user 用户对象
     * @throws NullPointerException 当 token 为 null 或 username 为 null 时
     */
    void refreshUserTokenCache(String token, User user) throws NullPointerException;

    String authorize(User user);
}
